<?php
    
    // 自动加载
    function autoLoad($class)
    {
        if (file_exists($class.ucfirst(Control_PATH).'.php')) {
            include $class.ucfirst(Control_PATH).'.php';
        }elseif (file_exists('./'.$class.'.php')) {
            include './'.$class.'.php';
        }
    }
    // 注册自动加载
    spl_autoload_register('autoLoad');

    // 定义常量
    define('URL_PATH',isset($_SERVER['PATH_INFO']) ? preg_replace('/\/+/','/',strtolower($_SERVER['PATH_INFO'])) : '/');
    define('APP_PATH', 'app');
    define('Control_PATH', 'controller');

    // 加载路由配置文件
    require './app/route.php';
    use Vwen\Route;
    Run();


    // URL生成
    function url($route='',$vars=[],$method='*')
    {
        return Route::getUrl($route,$vars,$method);
    }
    // 解析执行请求
    function Run()
    {
        $analysis = Route::parseUrl();
        if ($analysis['status'] === 404) {
            echo "error";
            return;
        }
        // 解析控制器类和方法
        $action = explode('/', trim($analysis['route'],'/'));
        $class = APP_PATH.'\\'.$action[0].'\\'.Control_PATH.'\\'.$action[1];
        $method = $action[2];
        // 反射不会触发自动加载，需提前引入文件
        include_once $class.ucfirst(Control_PATH).'.php';
        // 通过反射，取到控制器方法的参数名列表
        $Parameters = (new ReflectionClass($class))->getMethod($method)->getParameters();
        // 根据 参数名列表 生成 参数列表
        $argList = [];
        foreach ($Parameters as $value) {
            $argList[] = $analysis['param'][$value->name];
        }
        // 执行方法
        $res = (new $class)->$method(...$argList);
        // 返回值输出
        switch (gettype($res)) {
            case 'NULL':
            case 'boolean':
            case 'resource':
                break;
            
            case 'string':
            case 'integer':
            case 'double':
                echo $res;
                break;
            
            default:
                echo json_encode($res);
                break;
        }
    }